package ar.edu.utn.frba.disenio.aterrizar.usuario;

import java.util.ArrayList;
import java.util.Collections;
import ar.edu.utn.frba.disenio.aterrizar.aerolineas.Aerolinea;
import ar.edu.utn.frba.disenio.aterrizar.excepciones.AsientoErroneoException;
import ar.edu.utn.frba.disenio.aterrizar.excepciones.AsientoNoDisponibleException;
import ar.edu.utn.frba.disenio.aterrizar.filtros.Clase;
import ar.edu.utn.frba.disenio.aterrizar.filtros.Estado;
import ar.edu.utn.frba.disenio.aterrizar.filtros.Filtro;
import ar.edu.utn.frba.disenio.aterrizar.filtros.Precio;
import ar.edu.utn.frba.disenio.aterrizar.filtros.Ubicacion;
import ar.edu.utn.frba.disenio.aterrizar.orden.Orden;
import ar.edu.utn.frba.disenio.aterrizar.reserva.ManagerReserva;
import ar.edu.utn.frba.disenio.aterrizar.aerolineas.Vuelo;
import ar.edu.utn.frba.disenio.aterrizar.busquedas.BusquedaFiltrada;
import ar.edu.utn.frba.disenio.aterrizar.busquedas.BusquedaObligatoria;
import ar.edu.utn.frba.disenio.aterrizar.busquedas.CriterioBusqueda;
import ar.edu.utn.frba.disenio.aterrizar.compra.ManagerCompras;

public abstract class Usuario {

	private String nombre;
	private String apellido;
	private String dni;
	private int recargoUsuario;
	private double compras;
	private boolean superOfertas;
	private ArrayList<ArrayList<Vuelo>> busquedas = new ArrayList<ArrayList<Vuelo>>();
	
	public abstract void reservar(String codigoVuelo, Aerolinea aerolinea, ManagerReserva managerReserva);
	
	public void buscarVuelos(Aerolinea aerolinea, CriterioBusqueda busqueda, Filtro unFiltro, Orden unOrden){
		BusquedaFiltrada unaBusqueda;
		
		if(unFiltro != null) unaBusqueda = new Precio(unFiltro.precioDesde,unFiltro.precioHasta,new Clase(unFiltro.clases, new Ubicacion(unFiltro.ubicacion, new Estado(unFiltro.estado, busqueda, unFiltro.manager ,new BusquedaObligatoria(aerolinea, busqueda, this)))));	
		else unaBusqueda = new BusquedaObligatoria(aerolinea, busqueda, this);
		
		ArrayList<Vuelo> resultado = unaBusqueda.buscarVuelos();
		
		if(unOrden != null) Collections.sort(resultado, unOrden);
				
		this.getBusquedas().add(resultado);
	}		
	
	public void comprarAsiento(Aerolinea aerolinea, String codigoAsiento, ManagerCompras manager){
		
		try
		{			
			Vuelo vuelo = aerolinea.buscarVueloParticular(codigoAsiento, this);
			aerolinea.comprarAsiento(codigoAsiento, this);
			this.compras =+ vuelo.getValor();
			manager.agregarCompra(vuelo);
		}
		catch(AsientoErroneoException e){
			System.out.println(e.errorMessage());
		}
		catch(AsientoNoDisponibleException e){
			System.out.println(e.errorMessage());
		}	
	}

	///// BORRAR //////
	
	public void mostrarVuelosBuscados(){
		
		ArrayList<ArrayList<Vuelo>> busquedas = this.getBusquedas();
		
		for(ArrayList<Vuelo> unaBusqueda : busquedas){
			for(Vuelo unVuelo : unaBusqueda){
				System.out.print(unVuelo.codigo);
				System.out.print(";");
				System.out.print(unVuelo.valor);
				System.out.print(";");
				System.out.print(unVuelo.clase);
				System.out.print(";");
				System.out.print(unVuelo.ubicacion);
				System.out.print(";");
				System.out.print(unVuelo.estado);
				System.out.print(";");
				System.out.print(unVuelo.origen);
				System.out.print(";");
				System.out.print(unVuelo.destino);
				System.out.print(";");
				System.out.print(unVuelo.horaSalida);
				System.out.print(";");
				System.out.print(unVuelo.horaLlegada);
				System.out.print(";");
				System.out.print(unVuelo.duracion);
				System.out.println();
			}
		}		
	}
	
	//////////
	
	//// Getters y Setters /////
	
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getApellido() {
		return apellido;
	}
	public void setApellido(String apellido) {
		this.apellido = apellido;
	}
	public String getDni() {
		return dni;
	}
	public void setDni(String dni) {
		this.dni = dni;
	}
	public int getRecargoUsuario() {
		return recargoUsuario;
	}
	public void setRecargoUsuario(int recargoUsuario) {
		this.recargoUsuario = recargoUsuario;
	}
	public double getCompras() {
		return compras;
	}
	public void setCompras(double compras) {
		this.compras = compras;
	}
	public ArrayList<ArrayList<Vuelo>> getBusquedas() {
		return busquedas;
	}
	public void setBusquedas(ArrayList<ArrayList<Vuelo>> busquedas) {
		this.busquedas = busquedas;
	}
	public boolean isSuperOfertas() {
		return superOfertas;
	}
	public void setSuperOfertas(boolean superOfertas) {
		this.superOfertas = superOfertas;
	}
	
	//////////////////////////////////////////
}